/*
 * This file or a portion of this file is licensed under the terms of
 * the Globus Toolkit Public License, found in file GTPL, or at
 * http://www.globus.org/toolkit/download/license.html. This notice must
 * appear in redistributions of this file, with or without modification.
 *
 * Redistributions of this Software, with or without modification, must
 * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
 * some other similar material which is provided with the Software (if
 * any).
 *
 * Copyright 1999-2004 University of Chicago and The University of
 * Southern California. All rights reserved.
 */
package org.griphyn.vdl.annotation;

import java.sql.Types;

/**
 * This abstract base class defines the key value tuple that define the
 * heart of Yong's annotations. 
 *
 * @author Jens-S. Vöckler
 * @author Yong Zhao
 * @version $Revision: 50 $
 */
public abstract class Tuple
{
  /**
   * Defines the key for which we store the annotation.
   */
  private String m_key;

  /**
   * Array constructor, please don't use. 
   */
  public Tuple()
  {
    m_key = null;
  }

  /**
   * Constructs the key portion of a tuple.
   *
   * @param key is the key to store annotations for.
   */
  public Tuple( String key )
  {
    m_key = key;
  }

  /**
   * Obtains the current value of the key.
   *
   * @return the current value of the key.
   * @see #setKey( String )
   */
  public String getKey()
  {
    return m_key;
  }

  /**
   * Overwrites the key with a different name.
   *
   * @param key is the new key to use from now on.
   * @see #getKey()
   */
  public void setKey( String key )
  {
    m_key = key;
  }

  /**
   * Generate interface to obtain the value from an instance.
   * The value will be wrapped into the appropriate Java class.
   * For the timestamp object, the Java SQL Date will be used.
   *
   * @return the value wrapped as Java object.
   * @see #setValue( Object )
   */ 
  public abstract Object getValue();

  /**
   * Generic interface to set a value in an instance. Note
   * that this action may fail, if the instance is of an 
   * incompatible type.
   *
   * @param value is the data object to set. 
   * @see #getValue()
   * @exception ClassCastException if the actual argument type of the value
   * is incompatible with the value maintained by the instance.
   */ 
  public abstract void setValue( Object value )
    throws ClassCastException;

  /**
   * Returns the type of the value as SQL Type.
   *
   * @return a constant from the set of SQL types. 
   * @see java.sql.Types
   */ 
  public abstract int getType();

  /**
   * Returns the string representation of the type.
   */ 
  public abstract String getTypeString();

  /**
   * Return a string representation of the tuple
   */
  public String toString()
  {
    return  m_key + "\t" + getTypeString() + "\t" + getValue();
  }
}







